package array;

/**
 * 给你一个整数数组 nums 和两个整数 minK 以及 maxK 。
 * nums 的定界子数组是满足下述条件的一个子数组：
 * 子数组中的 最小值 等于 minK 。
 * 子数组中的 最大值 等于 maxK 。
 * 返回定界子数组的数目。
 * 子数组是数组中的一个连续部分。
 * <p>
 * 示例 1：
 * 输入：nums = [1,3,5,2,7,5], minK = 1, maxK = 5
 * 输出：2
 * 解释：定界子数组是 [1,3,5] 和 [1,3,5,2] 。
 * <p>
 * 示例 2：
 * 输入：nums = [1,1,1,1], minK = 1, maxK = 1
 * 输出：10
 * 解释：nums 的每个子数组都是一个定界子数组。共有 10 个子数组。
 *
 * @author Jisheng Huang
 * @version 20250426
 */
public class CountSubarrsWithFixedBound_2444 {
    /**
     * @param nums
     * @param minK
     * @param maxK
     * @return
     */
    public static long countSubarrays(int[] nums, int minK, int maxK) {
        long ans = 0;
        long jbad = -1;
        long jmin = -1;
        long jmax = -1;
        long n = nums.length;

        for (int i = 0; i < n; ++i) {
            // subarray里不能有nums[jbad]
            if (nums[i] < minK || nums[i] > maxK) {
                jbad = i;
            }

            // 最近的jmin
            if (nums[i] == minK) {
                jmin = i;
            }

            // 最近的jmax
            if (nums[i] == maxK) {
                jmax = i;
            }

            ans += Math.max(0L, Math.min(jmin, jmax) - jbad);
        }

        return ans;
    }

    public static void main(String[] args) {
        int[] nums = {1, 3, 5, 2, 7, 5};
        int minK = 1;
        int maxK = 5;
        System.out.println(countSubarrays(nums, minK, maxK));

        nums = new int[]{1, 1, 1, 1};
        minK = 1;
        maxK = 1;
        System.out.println(countSubarrays(nums, minK, maxK));
    }
}
